#include <iostream>
#include <thread>
#include <mutex>
using namespace std;

// 1、互斥锁
// 1、任意时刻只有一个线程可以持有某个互斥锁
// 2、对互斥锁的操作是原子性的：无法被打断

// mutex 锁 最底层方式，直接操作互斥量。
// 需要手动调用 unlock()，否则容易死锁。
// 异常不安全：如果在 lock() 和 unlock() 之间抛出异常，锁不会自动释放
std::mutex m1;
void foo(int &num)
{
    m1.lock();
    num++;
    m1.unlock();
}
void bar(int &num)
{
    m1.lock();
    num *= 2;
    m1.unlock();
}
int main()
{
    int num{1};
    thread t1(foo, std::ref(num));
    thread t2(bar, ref(num));
    t1.join();
    t2.join();
    cout << "num is " << num << endl;
    return 0;
}